package ctu.edu.vn.musicmanager.gui;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JRootPane;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.io.File;
import java.util.Vector;

import javax.swing.border.TitledBorder;
import javax.swing.filechooser.FileFilter;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.JTable;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.Timer;

import ctu.edu.vn.musicmanager.business.BMusicManager;
import ctu.edu.vn.musicmanager.business.Downloader;
import ctu.edu.vn.musicmanager.business.PlayMusic;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.BorderLayout;

@SuppressWarnings("serial")
public class MusicManager extends JFrame implements MessageListener {
	public static String host = "localhost";
	// Khai báo biến thiết cho các hoạt động
	static TopicPublisher topicPublisher;
	static Topic topicSender;
	static TopicSession topicSession;
	private int main_id;
	private String recognize;
	private boolean waiting;
	private Timer time;
	private String previous_header;
	private String previous_message;
	private BMusicManager BMM;
	private JLabel lblSongName;
	// Khai báo biến cho thiết kế giao diện
	private JPanel contentPane;
	private JFrame self;
	private DefaultTableModel model;
	private JTable table;
	private UploadPBar ub;
	private PlayMusic player;
	private int playing_id;

	private JButton btnPlayStop;

	private class UploadPBar extends JFrame {

		private JPanel contentPane;
		UploadPBar mself;
		private JProgressBar progressBar;
		private JLabel lblName;
		private int pos;
		File files[];
		JButton btnUpload;
		boolean stop;

		public UploadPBar() {
			setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
			pos = 0;
			stop = false;
			mself = this;
			setResizable(false);
			addWindowListener(new WindowAdapter() {
				@Override
				public void windowClosing(WindowEvent arg0) {
					stop = true;
					if (pos < files.length)
						if (JOptionPane.showConfirmDialog(mself,
								"Bạn muốn hủy bỏ quá trình upload ?",
								"Chọn lựa", JOptionPane.YES_NO_OPTION) == JOptionPane.NO_OPTION) {
							stop = false;
							success();
							return;
						}
					mself.setVisible(false);
				}
			});
			setBounds(100, 100, 422, 152);
			contentPane = new JPanel();
			contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
			setContentPane(contentPane);
			contentPane.setLayout(null);

			progressBar = new JProgressBar();

			progressBar.setBounds(10, 36, 386, 37);
			contentPane.add(progressBar);

			JLabel lblangc = new JLabel("Đang tải:");
			lblangc.setBounds(10, 11, 57, 14);
			contentPane.add(lblangc);

			lblName = new JLabel("tên bài hát");
			lblName.setBounds(74, 11, 332, 14);
			contentPane.add(lblName);

			btnUpload = new JButton("Upload");
			btnUpload.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					if (btnUpload.getText().equals("Bỏ qua")
							|| btnUpload.getText().equals("Tiếp tục")) {
						btnUpload.setText("Dừng lại");
						stop = false;
						lblName.setForeground(Color.BLACK);
						success();
					} else if (btnUpload.getText().equals("Đóng lại")) {
						mself.setVisible(false);
					} else {
						stop = true;
						btnUpload.setText("Tiếp tục");
					}
				}
			});
			btnUpload.setBounds(154, 84, 93, 23);
			contentPane.add(btnUpload);

		}

		public void setFiles(File files[]) {
			this.files = files;
			progressBar.setMaximum(files.length);
			btnUpload.setText("Dừng lại");
			pos = 0;
			stop = false;
			lblName.setForeground(Color.BLACK);
			success();
		}

		public void failure() {
			lblName.setForeground(Color.RED);
			btnUpload.setText("Bỏ qua");
			pos++;
			progressBar.setValue(pos);
		}

		public void success() {
			if (pos == files.length) {
				btnUpload.setText("Đóng lại");
				lblName.setText("Hoàn tất upload");
				lblName.setForeground(Color.GREEN);
				return;
			}
			if (stop) {
				btnUpload.setText("Tiếp tục");
				return;
			}

			lblName.setText(files[pos].getName());

			String data = BMM.readToString(files[pos].getAbsolutePath());
			if (data != null) {
				String header = "1:1:" + main_id;

				String fullname = lblName.getText();
				String tmpname = fullname.substring(0,
						fullname.lastIndexOf('.'));
				String tmpformat = fullname
						.substring(fullname.lastIndexOf('.') + 1);
				String mess = BMM.pre_addSongs(tmpname, tmpformat, data);
				previous_header = header;
				previous_message = mess;
				sendMessage(header, mess);
				pos++;
				progressBar.setValue(pos);
			} else {
				JOptionPane
						.showMessageDialog(mself,
								"Lỗi! File có dung lượng > 10MB hoặc định dạng không đúng!");
				failure();
			}

		}

	}

	public MusicManager() throws JMSException {

		// Init vars
		self = this;
		previous_message = null;
		previous_header = null;
		ub = new UploadPBar();
		BMM = new BMusicManager();
		playing_id = -1;
		waiting = false;

		ub.setLocationRelativeTo(self);
		FlashScreen flc = new FlashScreen();
		flc.setConnect(this);
		flc.setVisible(true);

		time = new Timer(8 * 1000, new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if (waiting) {
					time.stop();
					if (JOptionPane.showConfirmDialog(self,
							"Kết nối đến Server bị lỗi, chọn kết nối lại?",
							"Kết nối", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {

						Connect(BMM.Randomize());
					} else {
						JOptionPane.showMessageDialog(self,
								"Chương trình tự động thoát");
						System.exit(0);
					}
				}
			}
		});

		// Init GUI
		this.setLocationRelativeTo(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 542, 476);
		setTitle("MUSIC MANAGER");
		Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
		int x = (int) ((dimension.getWidth() - getWidth()) / 2);
		int y = (int) ((dimension.getHeight() - getHeight()) / 2);
		setLocation(x, y);

		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(new BorderLayout(0, 0));

		JPanel panel = new JPanel();
		panel.setBorder(new TitledBorder(null, "", TitledBorder.LEADING,
				TitledBorder.TOP, null, null));
		FlowLayout flowLayout = (FlowLayout) panel.getLayout();
		flowLayout.setVgap(1);
		flowLayout.setHgap(1);
		flowLayout.setAlignment(FlowLayout.LEFT);
		panel.setAlignmentX(Component.LEFT_ALIGNMENT);
		contentPane.add(panel, BorderLayout.NORTH);

		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent arg0) {
				sendMessage("5:" + main_id, "");
			}
		});

		JButton btnAddNew = new JButton("Thêm");
		btnAddNew.setIcon(new ImageIcon("./icons/add.png"));
		btnAddNew.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if (waiting) {
					JOptionPane.showMessageDialog(self,
							"Không nhận được phản hồi từ Server!");
					return;
				}
				uploadFiles();
			}
		});

		btnAddNew.setPreferredSize(new Dimension(130, 40));
		btnAddNew.setMaximumSize(new Dimension(89, 50));
		panel.add(btnAddNew);

		final JButton btnEdit = new JButton("Chỉnh sửa");
		btnEdit.setIcon(new ImageIcon("./icons/edit.png"));
		btnEdit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if (waiting) {
					JOptionPane.showMessageDialog(self,
							"Không nhận được phản hồi từ Server!");
					return;
				}
				Vector<String> newnames = new Vector<String>();
				Vector<Integer> ids = new Vector<Integer>();

				for (int i = 0; i < model.getRowCount(); i++) {
					if ((Boolean) model.getValueAt(i, 0)) {
						int id = (int) model.getValueAt(i, 3);

						if (id == playing_id)
							if (JOptionPane
									.showConfirmDialog(
											self,
											"Bài hát này đang được phát, bạn muốn tiếp tục?",
											"Lựa chọn",
											JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
								player.stopMusic();
								playing_id = -1;
							} else
								return;

						String value = JOptionPane.showInputDialog(self,
								"Cập nhật tên", model.getValueAt(i, 1));
						model.setValueAt(false, i, 0);
						if (value == null || value.equals("")
								|| value.equals(model.getValueAt(i, 1)))
							continue;

						newnames.add(value);
						ids.add(id);
					}
				}
				if (newnames.size() > 0) {
					String header = "2:" + newnames.size() + ":" + main_id;
					String mess = BMM.pre_editSongs(ids, newnames);
					sendMessage(header, mess);
					previous_header = header;
					previous_message = mess;
				}
			}
		});
		btnEdit.setPreferredSize(new Dimension(130, 40));
		btnEdit.setMaximumSize(new Dimension(89, 50));
		panel.add(btnEdit);

		final JButton btnDelete = new JButton("Xóa");
		btnDelete.setIcon(new ImageIcon("./icons/delete.png"));
		btnDelete.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if (waiting) {
					JOptionPane.showMessageDialog(self,
							"Không nhận được phản hồi từ Server!");
					return;
				}
				Vector<Integer> res = new Vector<Integer>();
				for (int i = 0; i < model.getRowCount(); i++)
					if ((Boolean) model.getValueAt(i, 0)) {
						int id_deleted = (int) table.getModel()
								.getValueAt(i, 3);
						if (id_deleted == playing_id)
							if (JOptionPane
									.showConfirmDialog(
											self,
											"Bài hát này đang được phát, bạn muốn tiếp tục?",
											"Lựa chọn",
											JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
								player.stopMusic();
								playing_id = -1;
							} else
								return;

						int choice = JOptionPane.showConfirmDialog(self,
								"Delete " + model.getValueAt(i, 1) + " ?",
								"Delete", JOptionPane.YES_NO_CANCEL_OPTION);
						model.setValueAt(false, i, 0);
						if (choice == JOptionPane.CANCEL_OPTION)
							return;

						if (choice == JOptionPane.YES_OPTION) {

							res.add(id_deleted);
						}

					}
				if (res.size() > 0) {
					String header = "3:" + res.size() + ":" + main_id;
					String mess = BMM.pre_deleteSongs(res);
					// System.out.println("3");
					sendMessage(header, mess);
					previous_header = header;
					previous_message = mess;
				}
			}
		});
		btnDelete.setPreferredSize(new Dimension(130, 40));
		btnDelete.setMaximumSize(new Dimension(89, 50));
		panel.add(btnDelete);

		JScrollPane ctrp = new JScrollPane();
		contentPane.add(ctrp, BorderLayout.CENTER);

		model = new DefaultTableModel() {
			@Override
			public boolean isCellEditable(int row, int column) {
				return column == 0;
			}

			@Override
			public Class getColumnClass(int column) {
				if (column == 0)
					return Boolean.class;
				if (column == 3)
					return Integer.class;
				return String.class;
			}

		};

		model.addColumn("Chọn");
		model.addColumn("Tên bài hát");
		model.addColumn("Định dạng");
		model.addColumn("ID");
		table = new JTable(model);
		table.addMouseListener(new java.awt.event.MouseAdapter() {
			@Override
			public void mouseClicked(java.awt.event.MouseEvent evt) {
				int row = table.rowAtPoint(evt.getPoint());
				if (row == -1)
					return;
				if (evt.getClickCount() == 2) {
					model.setValueAt(false, row, 0);
					Integer id = (Integer) model.getValueAt(row, 3);
					if (playing_id != -1)
						player.stopMusic();
					player = new PlayMusic(btnPlayStop, lblSongName);
					if (player.setMusic(id, (String) model.getValueAt(row, 1))) {
						player.start();
						playing_id = id;

					} else {
						JOptionPane
								.showMessageDialog(self,
										"Bài hát bạn chọn hiện đã bị lỗi, xin vui lòng chọn bài hát khác!");
						player.interrupt();
						btnPlayStop.setText("Play");
						btnPlayStop.setIcon(PlayMusic.PlayIcon);
					}
				}
			}

		});
		table.removeColumn(table.getColumnModel().getColumn(3));
		// Design table
		table.getColumnModel().getColumn(0).setMaxWidth(70);
		table.getColumnModel().getColumn(2).setMaxWidth(100);
		DefaultTableCellRenderer defaultRenderer = (DefaultTableCellRenderer) table
				.getDefaultRenderer(Object.class);

		defaultRenderer.setHorizontalAlignment(JLabel.LEFT);
		defaultRenderer.setForeground(Color.black);
		ctrp.setViewportView(table);

		JPanel panel_1 = new JPanel();
		panel_1.setBorder(new TitledBorder(null, "", TitledBorder.LEADING,
				TitledBorder.TOP, null, null));
		panel_1.setAlignmentX(0.0f);
		contentPane.add(panel_1, BorderLayout.SOUTH);
		panel_1.setLayout(new BorderLayout(0, 0));

		lblSongName = new JLabel("Chưa chọn bài hát");
		lblSongName.setPreferredSize(new Dimension(400, 30));
		panel_1.add(lblSongName);

		JPanel panel_2 = new JPanel();
		panel_1.add(panel_2, BorderLayout.EAST);

		btnPlayStop = new JButton("Play");
		panel_2.add(btnPlayStop);
		btnPlayStop.setIcon(PlayMusic.PlayIcon);
		btnPlayStop.setPreferredSize(new Dimension(100, 30));
		btnPlayStop.setMinimumSize(new Dimension(53, 25));

		btnPlayStop.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if (btnPlayStop.getText().equals("Play")) {
					int selectedRowIndex = table.getSelectedRow();

					if (selectedRowIndex != -1) {
						Integer id = (Integer) model.getValueAt(
								selectedRowIndex, 3);
						// btnPlayStop.setText("Stop");
						// btnPlayStop.setIcon(PlayMusic.StopIcon);
						player = new PlayMusic(btnPlayStop, lblSongName);
						if (player.setMusic(id,
								(String) model.getValueAt(selectedRowIndex, 1))) {
							player.start();
							playing_id = id;
						} else {
							JOptionPane
									.showMessageDialog(self,
											"Bài hát bạn chọn hiện đã bị lỗi, xin vui lòng chọn bài hát khác!");
							btnPlayStop.setText("Play");
							btnPlayStop.setIcon(PlayMusic.PlayIcon);
							try {
								player.interrupt();
							} catch (Exception ex) {
							}
						}
					}
				} else {
					playing_id = -1;
					// btnPlayStop.setText("Play");
					// btnPlayStop.setIcon(PlayMusic.PlayIcon);
					player.stopMusic();
				}
			}
		});
		btnPlayStop.setMaximumSize(new Dimension(89, 50));

		JButton btnDownload = new JButton("");
		btnDownload.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				int selectedRowIndex = table.getSelectedRow();
				if (selectedRowIndex != -1) {
					Integer id = (Integer) model
							.getValueAt(selectedRowIndex, 3);
					String name = (String) model
							.getValueAt(selectedRowIndex, 1);
					String type = (String) model
							.getValueAt(selectedRowIndex, 2);
					downloadFile(id, name, type);
				}
			}
		});
		btnDownload.setIcon(new ImageIcon("./icons/download.png"));
		btnDownload.setPreferredSize(new Dimension(30, 30));
		panel_2.add(btnDownload);
		while (flc.isVisible())
			System.out.println("Connecting ...");
		flc.dispose();
		Connect(BMM.Randomize());
	}

	public void downloadFile(int id, String name, String type) {
		FileFilter fit = new FileFilter() {
			@Override
			public boolean accept(File file) {
				String ex = file.getName();
				for (int i = ex.length() - 1; i >= 0; i--) {
					if (ex.charAt(i) == '.') {
						ex = ex.substring(i + 1);
						break;
					}
				}
				return file.isDirectory() || ex.equalsIgnoreCase("MP3")
						|| ex.equalsIgnoreCase("WMA");
			}

			@Override
			public String getDescription() {
				return "Tập tin nhạc";
			}

		};
		JFileChooser jf = new JFileChooser() {
			@Override
			public void approveSelection() {
				File f = getSelectedFile();
				if (f.exists() && getDialogType() == SAVE_DIALOG) {
					int result = JOptionPane.showConfirmDialog(this,
							"Ghi đè " + f.getName() + " ?", "Tập tin đã tồn tại?",
							JOptionPane.YES_NO_CANCEL_OPTION);
					switch (result) {
					case JOptionPane.YES_OPTION:
						super.approveSelection();
						return;
					case JOptionPane.NO_OPTION:
						return;
					case JOptionPane.CLOSED_OPTION:
						return;
					case JOptionPane.CANCEL_OPTION:
						cancelSelection();
						return;
					}
				}
				super.approveSelection();
			}
		};
		jf.setCurrentDirectory(new File(
				"C:\\Users\\Public\\Music\\Sample Music"));
		jf.setFileFilter(fit);
		jf.setSelectedFile(new File("C:\\Users\\Public\\Music\\Sample Music\\"
				+ name + "." + type));
		int ch = jf.showSaveDialog(this);
		if (ch == JFileChooser.APPROVE_OPTION) {
			String fname = jf.getSelectedFile().getAbsolutePath();
			if (!fname.substring(fname.lastIndexOf('.') + 1).toUpperCase().equals("MP3"))
				fname += ".MP3";
			Downloader dld = new Downloader();
			dld.setDownloadURL("http://" + host + "/mymusic/" + id + "." + type);
			dld.setSaveDirectory(fname);
			dld.execute();
			while (!dld.isDone()) {
			}
			if (dld.success)
				JOptionPane.showMessageDialog(self, "Đã tải thành công!");
			else
				JOptionPane.showMessageDialog(self, "Tải thất bại!");
		}

	}

	// Lấy thông tin những tập tin đã chọn
	public void uploadFiles() {
		FileFilter fit = new FileFilter() {

			@Override
			public boolean accept(File file) {
				String ex = file.getName();
				for (int i = ex.length() - 1; i >= 0; i--) {
					if (ex.charAt(i) == '.') {
						ex = ex.substring(i + 1);
						break;
					}
				}
				return file.isDirectory() || ex.equalsIgnoreCase("MP3")
						|| ex.equalsIgnoreCase("WMA");
			}

			@Override
			public String getDescription() {
				return "Tập tin nhạc";
			}

		};
		JFileChooser jf = new JFileChooser() {

			@Override
			public void approveSelection() {
				File f = getSelectedFile();
				if (!f.exists() && getDialogType() == OPEN_DIALOG) {
					JOptionPane.showMessageDialog(this,
							"Tập tin không tồn tại!");
					return;
				}
				super.approveSelection();
			}
		};
		jf.setCurrentDirectory(new File(
				"C:\\Users\\Public\\Music\\Sample Music"));
		jf.setFileFilter(fit);
		jf.setMultiSelectionEnabled(true);
		int ch = jf.showOpenDialog(this);
		if (ch == JFileChooser.APPROVE_OPTION) {
			ub.setFiles(jf.getSelectedFiles());
			ub.setVisible(true);
		}

	}

	// Nhận dữ liệu từ server trả về
	@Override
	public void onMessage(Message message) {
		try {

			String mess = ((TextMessage) message).getText();
			// System.out.println("Clients get: " + mess);
			waiting = false;
			time.stop();
			Process(mess);
		} catch (JMSException e) {
			// Không thể gữi dữ liệu
			JOptionPane.showMessageDialog(self,
					"Không thể gữi yêu cầu lên Server");
		}
	}

	// Tiến hành xử lí dữ liệu
	public void Process(String str) {

		// Phân tách dữ liệu và lưu vào biến mess
		Vector<Vector<String>> mess = BMM.Split(str);
		Vector<String> header = mess.get(0);

		// Yêu cầu kết nối, nhận ID
		if (header.get(0).charAt(0) == '0' && header.get(1).equals(recognize)) {
			// Server cấp quyền kết nối
			if (header.get(0).charAt(1) == '1') {
				// JOptionPane.showMessageDialog(self,
				// "Kết nối tới Server thành công, tiến hành lấy Dữ liệu");
				main_id = Integer.parseInt(header.get(2));
				sendMessage("4:" + main_id, "");

				recognize = "";
			} else // Server từ chối kết nối
			{
				JOptionPane.showMessageDialog(
						self,
						"Kết nối tới Server không thành công, "
								+ BMM.getErr(Integer.parseInt(header.get(2))));
			}
		}

		// Nhận dữ liệu thêm thông tin
		if (header.get(0).charAt(0) == '1') {
			int req_id = Integer.parseInt(header.get(2));
			int number = Integer.parseInt(header.get(1));

			// Yêu cầu do chính client này gữi
			if (main_id == req_id) {
				if (previous_header.charAt(0) == '1') {
					previous_message = null;
					previous_header = null;
				}
				if (header.get(0).charAt(1) == '1') {
					ub.success();
				} else {
					ub.failure();
				}

			}

			// Cập nhật dữ liệu của bảng khi có yêu cầu thêm được chấp nhận
			if (header.get(0).charAt(1) == '1') {
				for (int i = 1; i <= number; i++) {
					int id = Integer.parseInt(mess.get(i).get(0));
					String name = mess.get(i).get(1);
					String format = mess.get(i).get(2);
					BMM.addtoTable(id, name, format, model);
				}
			}
		} else // Nhận dữ liệu cập nhật thông tin
		if (header.get(0).charAt(0) == '2') {

			int req_id = Integer.parseInt(header.get(2));
			int number = Integer.parseInt(header.get(1));

			// Yêu cầu do chính client này gữi
			if (main_id == req_id) {
				if (previous_header.charAt(0) == '2') {
					previous_message = null;
					previous_header = null;
				}
				// Nhận thông báo cập nhật thành công
				if (header.get(0).charAt(1) == '1') {
					JOptionPane.showMessageDialog(self, "Đã sửa thành công "
							+ number + " tập tin nhạc!");
				}
				// Nhận thông báo cập nhật thành công
				if (header.get(0).charAt(1) == '0') {
					JOptionPane.showMessageDialog(self, "Có " + number
							+ " tập tin nhạc không sửa được!");
					// Chi tiết lỗi nằm trong vector mess
				}
			}
			// Cập nhật dữ liệu của bảng khi có yêu cầu cập nhật được chấp nhận
			String nname = null;
			if (header.get(0).charAt(1) == '1') {
				for (int i = 1; i <= number; i++) {
					int id = Integer.parseInt(mess.get(i).get(0));
					String newname = mess.get(i).get(1);
					if (id == playing_id)
						nname = newname;
					BMM.updatetoTable(id, newname, model);
				}
			}
			if (nname != null) {
				JOptionPane.showMessageDialog(self,
						"Bài hát bạn đang nghe đã được cập nhật tên!");
				lblSongName.setText(nname);
			}
		} else // Nhận dữ liệu xóa thông tin
		if (header.get(0).charAt(0) == '3') {

			int req_id = Integer.parseInt(header.get(2));
			int number = Integer.parseInt(header.get(1));

			// Yêu cầu do chính client này gữi
			if (main_id == req_id) {
				if (previous_header.charAt(0) == '3') {
					previous_message = null;
					previous_header = null;
				}
				// Nhận thông báo xóa thành công
				if (header.get(0).charAt(1) == '1') {
					JOptionPane.showMessageDialog(self, "Đã xóa thành công "
							+ number + " tập tin nhạc!");
				}
				// Nhận thông báo xóa thất bại
				if (header.get(0).charAt(1) == '0') {
					JOptionPane.showMessageDialog(self, "Có " + number
							+ " tập tin nhạc không xóa được!");
					// Chi tiết lỗi nằm trong vector mess
				}
			}
			// Cập nhật dữ liệu của bảng khi có yêu cầu xóa được chấp nhận
			boolean isdeleted = false;
			if (header.get(0).charAt(1) == '1') {
				for (int i = 1; i <= number; i++) {
					int id = Integer.parseInt(mess.get(i).get(0));
					if (id == playing_id) {
						isdeleted = true;
					}
					BMM.deletetoTable(id, model);
				}
			}
			if (isdeleted) {
				player.stopMusic();
				JOptionPane
						.showMessageDialog(self,
								"Bài hát bạn đang nghe đã bị xóa, xin vui lòng chọn bài khác!");
				playing_id = -1;
			}
		} else // Server trả thông tin yêu cầu cấp dữ liệu
		if (header.get(0).charAt(0) == '4') {

			int req_id = Integer.parseInt(header.get(2));
			int number = Integer.parseInt(header.get(1));

			if (main_id == req_id) {
				// Yêu cầu cấp dữ liệu được server chấp nhận
				if (header.get(0).charAt(1) == '1') {
					// JOptionPane.showMessageDialog(self, "�?ã nhận được "
					// + number + " tập tin nhạc!");

					// Cập nhật dữ liệu của bảng khi server trả dữ liệu v�?
					for (int i = 1; i <= number; i++) {
						int id = Integer.parseInt(mess.get(i).get(0));
						String name = mess.get(i).get(1);
						String format = mess.get(i).get(2);
						BMM.addtoTable(id, name, format, model);
					}
					if (previous_header != null) {
						if (JOptionPane
								.showConfirmDialog(
										self,
										"Đã kết nối với Sever, bạn có muốn gữi lại thông tin đã mất?",
										"Gữi lại", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
							sendMessage(previous_header, previous_message);
						}
					}
				}

				// Yêu cầu cấp dữ liệu bị server từ chối
				if (header.get(0).charAt(1) == '0') {
					JOptionPane.showMessageDialog(self,
							"Lỗi, " + BMM.getErr(number));
				}
			}

		}

	}

	// Gữi dữ liệu
	public void sendMessage(String header, String message) {
		try {
			time.start();
			waiting = true;
			topicPublisher.publish(topicSession.createTextMessage(header
					+ message));

		} catch (JMSException e) {
			e.printStackTrace();
		}

	}

	public void Connect(String reg) {
		main_id = -1;
		recognize = reg;
		BMM.clearTable(model);
		sendMessage("0:" + recognize, "");
	}
}
